package de.htw.ejb.transaktionen.bestellverwaltung.schnittstelle;

/**
 * Klasse fuer die Verwaltung der Bestellungen
 * 
 * @author Torsten Mansfeld
 */
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Properties;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.interceptor.Interceptors;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import de.htw.ejb.manager.EntityManagementDienstRemote;
import de.htw.ejb.manager.exceptions.EntityManagementDienstException;
import de.htw.ejb.model.Bestellposition;
import de.htw.ejb.model.Bestellung;
import de.htw.ejb.model.Kunde;
import de.htw.ejb.transaktionen.bestellverwaltung.listener.BestellverwaltungLifeCycleMonitor;

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Interceptors( value = { BestellverwaltungLifeCycleMonitor.class } )
public class Bestellverwaltung implements IBestellverwaltung {

	EntityManagementDienstRemote em;
	Properties properties = new Properties();
	
	
	public void initManager(){
		properties.put( Context.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory" );
		properties.put( Context.PROVIDER_URL, "127.0.0.1:1099" );
		InitialContext ctx;
		try{
		ctx = new InitialContext( properties );
		
		em = ( EntityManagementDienstRemote ) ctx
			.lookup( "EntityManagementDienstBean/remote" );
		}catch ( NamingException e1 )
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}

	@Override
	public void erstelleBestellunge(Kunde kunde, Date bestelldatum,
			Date lieferdatum, List<Bestellposition> posis) {
		initManager();
		Bestellung neu = new Bestellung();
		neu.setBestelldatum(bestelldatum);
		neu.setLieferdatum(lieferdatum);
		neu.setKunde(kunde);
		neu.setPositionen(posis);
		try {
			em.speichern(neu);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// TODO Auto-generated method stub

	}

	@Override
	public void erstelleBestellung(Bestellung neueBestellung) {
		initManager();
		
		try {
			em.speichern(neueBestellung);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// TODO Auto-generated method stub

	}

	@Override
	public void loescheBestellung(int id) {
		initManager();
		try {
			em.loescheBestellung(id);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// TODO Auto-generated method stub

	}

	@Override
	public void hinzufuegenBestellung(Bestellung neueBestellung) {
		initManager();
		try {
			em.speichern(neueBestellung);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub

	}

	@Override
	public void bearbeitenBestellung(int bestellnummer, Bestellung neu) {
		initManager();
		try {
			em.loescheBestellung(bestellnummer);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			em.speichern(neu);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub

	}

	//
	// @Override
	// public void abschliessenBestellung(int id) {
	// try {
	// Bestellung alt=(Bestellung) manager.sucheBestellungPerBestellnummer(id);
	// alt.
	// } catch (EntityManagementDienstException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	//
	// // TODO Auto-generated method stub
	//
	// }

	@Override
	public Bestellung sucheBestellungNachKunde(Kunde kunde) {
		initManager();
		
		
		// TODO Manager Methode zum Suchen einer Bestellung nach Kunde
		return null;
	}

	@Override
	public Bestellung sucheBestellung(int id) {
		initManager();
		Bestellung suche=null;
		try {
			suche = (Bestellung) em.sucheBestellungPerBestellnummer(id);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return suche;
	}

	@Override
	public List<Bestellung> alleBestellungenanzeigen() {
		initManager();
		
		// TODO Managermethode um alle bestellungen anzeigen zu lassen
		return null;
	}
	
	public List<Bestellung> anzeigenoffeneBestellungen(){
		initManager();
		//TODO Managermethode um alle bestellungen anzeigen zu lassen
		List<Bestellung> alleBest=null;
		List<Bestellung> offeneBest=null;
        GregorianCalendar now = new GregorianCalendar();
        //DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);  
        Date datum=now.getTime();
		for (int i=0; i<alleBest.size();i++){
			if (alleBest.get(i).getBestelldatum().compareTo(datum)>=0){
				offeneBest.add(alleBest.get(i));
			}
		}
		
		
		return offeneBest;
		
	}

	@Override
	public double umsatzermitteln(Date datum) {
		initManager();
		List<Bestellung>bestellungen=(List<Bestellung>) null; //Methode von Manager die einem alle Bestellungen zurueck gibt
		
		int index=0;
		double umsatz=0;
		while (bestellungen.get(index).getLieferdatum().compareTo(datum) >= 0) {
			List<Bestellposition> bestellpos = (List<Bestellposition>) bestellungen
					.get(index).getPositionen();
			for (int i = 0; i < bestellpos.size(); i++) {
					umsatz += bestellpos.get(i).getArtikel().getPreis()
							* bestellpos.get(i).getAnzahl();
				}

		}
		return umsatz;
	}

	@Override
	public void abschliessenBestellung(int id) {
		initManager();
		// TODO Auto-generated method stub
		
	}

}
